package cn.tedu.loding.service.impl;

import cn.tedu.loding.ex.ServiceException;
import cn.tedu.loding.mapper.AttributeMapper;
import cn.tedu.loding.mapper.AttributeTemplateMapper;
import cn.tedu.loding.mapper.CategoryAttributeTemplateMapper;
import cn.tedu.loding.mapper.ProductMapper;
import cn.tedu.loding.pojo.dto.AttributeTemplateAddNewDTO;
import cn.tedu.loding.pojo.dto.AttributeTemplateUpdateDTO;
import cn.tedu.loding.pojo.entity.Attribute;
import cn.tedu.loding.pojo.entity.AttributeTemplate;
import cn.tedu.loding.pojo.vo.*;
import cn.tedu.loding.service.IAttributeTemplateService;
import cn.tedu.loding.web.ServiceCode;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class AttributeTemplateServiceImpl implements IAttributeTemplateService {
    @Autowired
    AttributeTemplateMapper attributeTemplateMapper;
    @Autowired
    AttributeMapper attributeMapper;
    @Autowired
    CategoryAttributeTemplateMapper categoryAttributeTemplateMapper;
    @Autowired
    ProductMapper productMapper;


    // 分页查询所有属性信息的方法
// 参数page是页码,pageSize是每页条数
    public PageInfo<AttributeTemplateListVO> getAllAttributeTemplateByPage(Integer page, Integer pageSize){
        // Pagehepler框架实现分页功能最核心的代码,是要编写在执行查询数据库代码之前的
        // PageHelper.startPage方法就是在设置分页的查询条件
        // page是查询的页码(从1开始),pageSize是每页条数
        PageHelper.startPage(page,pageSize);
        // 上面设置好分页查询条件,下面的查询在执行时,sql语句会自动被追加limit关键字
        List<AttributeTemplateListVO>list= attributeTemplateMapper.list();

        // list变量并不是全查结果,而是只包含指定页码内容的数据
        // 我们分页业务功能不能只返回分页查询结果,还需要提供分页信息
        // PageHelper框架提供了PageInfo类,既能保存分页结果,也能保存分页信息
        // 分页信息无需我们计算,直接实例化PageInfo对象,它会自动根据上面的查询生成
        return new PageInfo<>(list);
    }


//    添加属性模板
    @Override
    public void addNew(AttributeTemplateAddNewDTO attributeTemplateAddNewDTO) {
        log.debug("开始处理【添加属性模板】业务,参数为{}",attributeTemplateAddNewDTO);
        {

            int count = attributeTemplateMapper.countByNameAndNotId(attributeTemplateAddNewDTO.getProductId(),attributeTemplateAddNewDTO.getName());
            if (count > 0) {
                String message = "属性模板名称已被占用,添加失败";
                log.debug(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }
        AttributeTemplate attributeTemplate = new AttributeTemplate();
        BeanUtils.copyProperties(attributeTemplateAddNewDTO,attributeTemplate);
        attributeTemplate.setGmtCreate(LocalDateTime.now());
        attributeTemplate.setGmtModified(LocalDateTime.now());
        log.debug("名称未占用,将插入数据{}",attributeTemplate);
        int count = attributeTemplateMapper.insert(attributeTemplate);
        if (count!=1){
            String message = "服务器繁忙,稍后再试";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }
        log.debug("插入成功,数据为{}",attributeTemplate);
    }

    //删除属性模板
    @Override
    public void delete(Long id) {
        log.debug("开始根据id【{}】处理删除属性模板操作",id);
        {
            AttributeTemplateStandardVO result= attributeTemplateMapper.getStandardById(id);
            if (result == null) {
                String message = "该属性模板不存在,删除失败";
                log.debug(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }
        {
            AttributeStandardVO result = attributeMapper.getStandardById(id);
            log.debug("开始根据属性模板id【{}】查询到关联表中的数据有:{}",id,result);
            if (result!=null){
                String message = "该属性模板存在关联数据,删除失败";
                log.debug(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }

        }

        // 如果有类别关联到了此属性模板，不允许删除
        {
            int count = categoryAttributeTemplateMapper.countByAttributeTemplateId(id);
            if (count > 0) {
                String message = "删除属性模板失败！当前属性模板仍存在关联的类别！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }

        int count = attributeTemplateMapper.deleteById(id);
        if (count != 1) {
            String message = "服务器繁忙,稍后再试";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        log.debug("删除成功!");
    }

    //根据id修改属性模板
    @Override
    public void update(AttributeTemplateUpdateDTO attributeTemplateUpdateDTO) {
        log.debug("开始处理【根据id修改属性模板】");
        AttributeTemplateStandardVO attributeTemplateStandardVO = attributeTemplateMapper.getStandardById(attributeTemplateUpdateDTO.getId());
        if (attributeTemplateStandardVO==null){
            String message = "修改失败,id无效";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        {
            int count = attributeTemplateMapper.countByNameAndNotId(attributeTemplateUpdateDTO.getId(),attributeTemplateUpdateDTO.getName());
            if (count > 0) {
                String message = "修改失败,属性模板名已存在";
                log.debug(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
            }
        }
        AttributeTemplate attributeTemplate = new AttributeTemplate();
        BeanUtils.copyProperties(attributeTemplateUpdateDTO,attributeTemplate);
        attributeTemplate.setGmtModified(LocalDateTime.now());
        log.debug("将执行修改操作");
        int count = attributeTemplateMapper.update(attributeTemplate);
        if (count!=1){
            String message = "修改失败,服务器繁忙,稍后再试";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT,message);
        }
    }

    //根据id查询属性模板详情
    @Override
    public AttributeTemplateStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询类别详情】业务,参数为:{}",id);
        AttributeTemplateStandardVO attributeTemplateStandardVO = attributeTemplateMapper.getStandardById(id);
        if (attributeTemplateStandardVO==null){
            String message = "查询失败,id无效";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        return attributeTemplateStandardVO;
    }

    //属性模板列表
    @Override
    public List<ProductListVO> list() {
        log.debug("开始处理【属性模板列表】业务,无参数");
        return productMapper.list();
    }

    //属性列表
    @Override
    public List<AttributeStandardVO> AttributeList(Long productId) {
        log.debug("开始处理【根据商品id查询属性列表】业务,参数为{}",productId);
        List<AttributeTemplateStandardVO> attributeTemplateStandardVOS = attributeTemplateMapper.getStandardByProductId(productId);
        log.debug("从属性模板表中查到数据的数量是{}",attributeTemplateStandardVOS);
        if (attributeTemplateStandardVOS==null){
            String message = "查询失败,商品不存在";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        List<Long>templateIds = new ArrayList<>();
        for (AttributeTemplateStandardVO item:attributeTemplateStandardVOS) {
            templateIds.add(item.getId());
        }

        List<AttributeStandardVO> standardByTemplateIds = attributeMapper.getStandardByTemplateIds(templateIds);
        log.debug("查询出的属性有{}",standardByTemplateIds);
        return standardByTemplateIds;
    }

    @Override
    public List<AttributeTemplateStandardVO> Templates(Long productId) {
        log.debug("开始处理【根据商品id查询属性模板】业务,参数为{}",productId);
        List<AttributeTemplateStandardVO> templates = attributeTemplateMapper.getStandardByProductId(productId);
        log.debug("从属性模板表中查到数据的数量是{}",templates);
        if (templates==null){
            String message = "查询失败,商品不存在";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        return templates;
    }

}
